package com.atguigu.yygh.order.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.exphandler.YyghException;
import com.atguigu.utils.HttpRequestHelper;
import com.atguigu.yygh.enums.OrderStatusEnum;
import com.atguigu.yygh.enums.PaymentStatusEnum;
import com.atguigu.yygh.enums.PaymentTypeEnum;
import com.atguigu.yygh.hosp.client.HospFeignClient;
import com.atguigu.yygh.model.order.OrderInfo;
import com.atguigu.yygh.model.order.PaymentInfo;
import com.atguigu.yygh.order.mapper.OrderInfoMapper;
import com.atguigu.yygh.order.mapper.PaymentInfoMapper;
import com.atguigu.yygh.order.service.PaymentInfoService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 * 支付信息表 服务实现类
 * </p>
 *
 * @author atguigu
 * @since 2023-06-17
 */
@Service
public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, PaymentInfo> implements PaymentInfoService {


    @Autowired
    OrderInfoMapper orderInfoMapper;

    @Autowired
    HospFeignClient hospFeignClient;

    @Override
    public void createPaymentInfo(OrderInfo orderInfo) {
        //判断该订单对应的支付记录是否存在（根据什么去查？ order_id 就可以）
        QueryWrapper<PaymentInfo> wrapper = new QueryWrapper<>();
        wrapper.eq("order_id",orderInfo.getId());
        PaymentInfo paymentInfo = baseMapper.selectOne(wrapper);
        if(paymentInfo==null){
            //为订单创建一个支付记录
            paymentInfo = new PaymentInfo();
            paymentInfo.setOutTradeNo(orderInfo.getOutTradeNo());//一个订单对应的支付记录和退款记录中的OutTradeNo都是一样的
            paymentInfo.setOrderId(orderInfo.getId());//订单id
            paymentInfo.setPaymentType(PaymentTypeEnum.WEIXIN.getStatus());//支付方式 1-支付宝  2-微信
            paymentInfo.setTotalAmount(orderInfo.getAmount());

            //2023-01-07|北京协和医院|科室名称|副主任医师
            String subject = new DateTime(orderInfo.getReserveDate()).toString("yyyy-MM-dd")+"|"+orderInfo.getHosname()+"|"+orderInfo.getDepname()+"|"+orderInfo.getTitle();
            paymentInfo.setSubject(subject);
            paymentInfo.setPaymentStatus(PaymentStatusEnum.UNPAID.getStatus());//1-支付中  2-已支付

            baseMapper.insert(paymentInfo);
        }
    }

    //支付成功后的需求：
    //1、调用医院端的“更新支付状态”接口，将医院端的订单状态改成1已支付`yygh_manage`.`order_info`
    //2、将平台端的订单状态改成1已支付
    //3、 修改PaymentInfo中的4个字段
    //    将平台端订单的支付记录的状态改成2已支付
    //   为该订单的支付记录中的  trade_no（微信支付订单号transaction_id）  callback_time（支付成功的时间）  callback_content（map.toString）
    @Override
    public void paySuccess(Long orderId, Map map) {

        //根据订单id查询订单
        OrderInfo orderInfo = orderInfoMapper.selectById(orderId);

        //订单中有医院编号hoscode，远程服务调用，获取该医院的接口地址
        String apiUrl = hospFeignClient.getApiUrl(orderInfo.getHoscode());

        //医院端的更新支付状态接口（支付成功后，医院端的订单的状态改成1）
        String url =  apiUrl + "/order/updatePayStatus";


        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("hoscode",orderInfo.getHoscode());
        paramMap.put("hosRecordId",orderInfo.getHosRecordId());//医院端订单id

        JSONObject jsonObject = HttpRequestHelper.sendRequest(paramMap, url);

        //判断是否调用成功
        Integer code = jsonObject.getInteger("code");
        if(code!=200){
            throw new YyghException(20001,"医院端更新支付状态接口调用失败");
        }


        //更新平台端的订单状态，改成1
        orderInfo.setOrderStatus(OrderStatusEnum.PAID.getStatus());
        orderInfoMapper.updateById(orderInfo);


        //查询该订单的支付记录
        QueryWrapper<PaymentInfo> wrapper = new QueryWrapper<>();
        wrapper.eq("order_id",orderId);
        PaymentInfo paymentInfo = baseMapper.selectOne(wrapper);

        paymentInfo.setPaymentStatus(PaymentStatusEnum.PAID.getStatus());//2-已支付
        paymentInfo.setCallbackTime(new Date());//支付成功后的时间
        paymentInfo.setCallbackContent(map.toString());//map： 调用微信端查询订单接口，返回的数据
        paymentInfo.setTradeNo(map.get("transaction_id")+"");//map中的transaction_id（微信支付订单号	， 支付的流水号）

        baseMapper.updateById(paymentInfo);

    }

    @Override
    public PaymentInfo getPayment(Long orderId) {
        QueryWrapper<PaymentInfo> wrapper = new QueryWrapper<>();
        wrapper.eq("order_id",orderId);
        PaymentInfo paymentInfo = baseMapper.selectOne(wrapper);
        return paymentInfo;
    }
}
